<?php
namespace redis;

class RedisPackage{
    protected static $handler = null;
    //timeout 关闭时间   0:代表不关闭
    protected $options = [
        'timeout' => 0,
        'expire' => 0,
        'persistent' => false,
        'prefix' => '',
    ];

    public function __construct()
    {
        $config = include __DIR__."/../../adminconfig/config.php";
//        echo 1;
//        echo extension_loaded('redis');die;
        if (!extension_loaded('redis')) {   //判断是否有扩展(如果你的apache没reids扩展就会抛出这个异常)
            throw new \BadFunctionCallException('not support: redis');
        }

        $func = $this->options['persistent'] ? 'pconnect' : 'connect';     //判断是否长连接
        self::$handler = new \redis;
        self::$handler->$func($config["redis"]['host'], $config["redis"]['port'], $this->options['timeout']);
        if ('' != $config["redis"]['password']) {
            $res = self::$handler->auth($config["redis"]['password']);
            //throw new \BadFunctionCallException($res);
        }
        if (0 != $config["redis"]['select']) {
            self::$handler->select($config["redis"]['select']);
        }else{
            self::$handler->select(0);
        }
//         self::$handler->ping();
    }

    /**
     * 写入缓存
     * @param string $key 键名
     * @param string $value 键值
     * @param int $exprie 过期时间 0:永不过期
     * @return bool
     */
    public static function set($key, $value, $exprie = 0)
    {
        if ($exprie == 0) {
            $set = self::$handler->set($key, $value);
        } else {
            $set = self::$handler->setex($key, $exprie, $value);
        }
        return $set;
    }

    /**
     * 写入缓存
     * @param string $key 键名
     * @param string $value 键值
     * @param int $exprie 过期时间 0:永不过期
     * @return bool
     */
    public function setnx($key,$value,$exprie = 0){
        if ($exprie == 0) {
            $set = self::$handler->setnx($key, $value);
        } else {
            $set = self::$handler->setnx($key, $value);
            self::$handler->expire($key,$exprie);
        }
        return $set;
    }

    /**
     * 写入缓存
     * @param string $key 键名
     * @param string $value 键值
     * @param int $exprie 过期时间 0:永不过期
     * @return bool
     */
    public static function expire($key, $ttl=0)
    {
        return self::$handler->expire($key, $ttl);
    }

    /**
     * 写入缓存
     * @param string $key 键名
     * @param string $value 键值
     * @param int $exprie 过期时间 0:永不过期
     * @return bool
     */
    public static function exists($key)
    {
        $res = self::$handler->exists($key);
        return $res;
    }

    /**
     * 读取缓存
     * @param string $key 键值
     * @return mixed
     */
    public static function get($key)
    {

        $fun = is_array($key) ? 'Mget' : 'get';
        return self::$handler->{$fun}($key);
    }

    /**
     * 获取值长度
     * @param string $key
     * @return int
     */
    public static function lLen($key)
    {
        return self::$handler->lLen($key);
    }

    /**
     * 将一个或多个值插入到列表头部
     * @param $key
     * @param $value
     * @return int
     */
    public static function LPush($key, $value, $value2 = null, $valueN = null)
    {
        return self::$handler->lPush($key, $value);
    }

    /**
     * 移出并获取列表的第一个元素
     * @param string $key
     * @return string
     */
    public static function lPop($key)
    {
        return self::$handler->lPop($key);
    }

    /**
     * 移除列表的最后一个元素，返回值为移除的元素。
     * @param $key
     * @return string
     */
    public static function rpop($key){
        return self::$handler->rpop($key);
    }
    /**
     * 返回key,支持*多个字符，?一个字符
     * 只有*　表示全部
     * @param string $key
     * @return array
     */
    public function keys($key)
    {
        return self::$handler->keys($key);
    }

    /**
     * 返回队列指定区间的元素
     * @param unknown $key
     * @param unknown $start
     * @param unknown $end
     */
    public function lRange($key,$start,$end)
    {
        return self::$handler->lrange($key,$start,$end);
    }

    /**
     * 删除指定key
     * @param unknown $key
     */
    public function del($key)
    {
        return self::$handler->del($key);
    }

    /**
     * 设定队列中指定index的值。
     * @param unknown $key
     * @param unknown $index
     * @param unknown $value
     */
    public function lSet($key,$index,$value)
    {
        return self::$handler->lSet($key,$index,$value);
    }

    /**
     * 返回队列中指定索引的元素
     * @param unknown $key
     * @param unknown $index
     */
    public function lIndex($key,$index)
    {
        return self::$handler->lIndex($key,$index);
    }
    /**
     * 给当前集合添加一个元素
     * 如果value已经存在，会更新order的值。
     * @param string $key
     * @param string $order 序号
     * @param string $value 值
     * @return bool
     */
    public function zAdd($key,$order,$value)
    {
        return self::$handler->zAdd($key,$order,$value);
    }

    /**
     * 给当前集合添加一个元素
     * @param string $key
     * @param string $value 值
     * @return bool
     */
    public function sAdd($key,$value)
    {
        return self::$handler->sAdd($key,$value);
    }


    /**
     * 返回值为value的order值
     * @param unknown $key
     * @param unknown $value
     */
    public function zScore($key,$value)
    {
        return self::$handler->zScore($key,$value);
    }

    /**
     * 集合以order递增排列后，0表示第一个元素，-1表示最后一个元素
     * @param string $key
     * @param int $start
     * @param int $end
     * @return array|bool
     */
    public function zRange($key,$start,$end)
    {
        return self::$handler->zRange($key,$start,$end);
    }

    /**
     * HASH集合
     * 同时将多个 field-value (字段-值)对设置到哈希表中
     * @param $key
     * @param $value
     * @return bool
     */
    public function hMset($key,$value)
    {
        return self::$handler->hMset($key,$value);
    }

    /**
     * 获取在哈希表中指定 key 的所有字段和值
     * @param $key
     * @return array
     */
    public function hGetAll($key)
    {
        return self::$handler->hGetAll($key);
    }

    /**
     * 获取所有给定字段的值
     * @param $key
     * @param $value
     * @return string
     */
    public function hMGet($key,$value)
    {
        return self::$handler->hMGet($key,$value);
    }

    public function hGet($key, $hashKey){
        return self::$handler->hGet($key, $hashKey);
    }

    public function Close(){
        return self::$handler->close();
    }

    public function hSet($key,$hashKey,$value)
    {
        return self::$handler->hSet($key,$hashKey,$value);
    }

    public function zDelete($key,$hashKey)
    {
        return self::$handler->hDel($key,$hashKey);
    }

    public function zrem($key,$member){
        return self::$handler->zRem($key,$member);
    }

    /*
     * 批量删除redis有序集合
     * $key     建名
     * $delstr   要删除的成员逗号拼接    ,1,2,3,4,5,6
     */
    public function zAllrem($key, $delstr){
        $str = "return self::".'$handler'."->zRem('"."$key"."'"."{$delstr}".");";
//        var_dump($str);die;
        eval($str);
//        $str = 'cat'.$a.'bird2'.$a.'bird12'.$a.'2313332'.$a.'ds'.$a.'bird16';
//        return self::$handler->zRem($key,"cat","bird1","bird8","bird5","bird66","2313332");
    }

    public  function ZREVRANGEBYSCORE($key, $start, $end, array $options = array() ){
        return self::$handler->zRevRangeByScore($key, $start, $end,$options);
    }

    /**
     * @param $key
     * @param $start
     * @param $end
     * @param null $withscore
     * 返回有序集中指定区间内的成员，通过索引，分数从高到底
     * @return array
     */
    public  function zRevRange( $key, $start, $end, $withscore = null ){
        return self::$handler->zRevRange( $key, $start, $end, $withscore = null );
    }

    /**
     * @param $key
     * @param $start
     * @param $end
     * 计算在有序集合中指定区间分数的成员数
     * @return int
     */
    public  function ZCOUNT( $key, $start, $end){
        return self::$handler->ZCOUNT( $key, $start, $end);
    }

    /**
     * @param $key
     * @param $value
     * @param $member
     * 有序集合中对指定成员的分数加上增量 increment
     * @return float
     */
    public  function ZINCRBY( $key, $value, $member){
        return self::$handler->ZINCRBY( $key, $value, $member);
    }
    public function ZCARD($key){
        return self::$handler->zCard($key);
    }

    public  function  Delete($key){
        return self::$handler->delete(self::$handler->keys($key));
    }


    public  function  sRem($key,$value){
        return self::$handler->sRem($key,$value);
    }

    public  function  hScan($key, $iterator, $pattern = null, $count = 0){
        return self::$handler->hScan($key, $iterator, $pattern = null, $count = 0);
    }

    public  function  zRangeByScore($key, $start, $end, $options = array()){
        return self::$handler->zRangeByScore($key, $start, $end,$options);
    }


    public function  HVALS($key){
        return self::$handler->HVALS($key);
    }

    //获取key的剩余有效时间
    public  function  ttl($key){
        return self::$handler->ttl($key);
    }

    public  function  INCRBY($key,$num){
        return self::$handler->INCRBY($key,$num);
    }

    public  function  decrBy($key,$num){
        return self::$handler->decrBy($key,$num);
    }

    /*
     * 为hash指定key增量或减量
     */
    public function HINCRBY($key, $hashKey, $value){
        return self::$handler->HINCRBY($key, $hashKey, $value);
    }

    public function evalfz($str){
        return self::$handler->eval($str);
    }

    public function SETEX($key,$time,$value){
        return self::$handler->SETEX($key,$time,$value);
    }

}